#ifndef CLIB_DPDK_PORT_H
#define CLIB_DPDK_PORT_H

#pragma once

#ifdef __cplusplus
extern "C" {
#endif

#include "clib_core.h"
#include "inc/clib_dpdk.h"
#include "clib_port_conf.h"

#define CLIB_RSS_HASH_KEY_LENGTH 40

#define CLIB_DPDK_MBUF_MAX       4096

typedef struct clib_netif_node_s
{
    u16_t                   port_id;                     //端口 ID
    u16_t                   queue;                       //队列 ID
    i16_t                   socket_id;                   //绑定队列的 CPU 所在的 socket 编号
    u16_t                   lcore_id;                    //绑定队列的线程编号
    struct rte_mempool     *rx_mbuf_pool;                //接收数据包的内存池
    struct rte_mempool     *tx_mbuf_pool;                //发送数据包的内存池
    u16_t                   rx_pkts;                     //接收数据包的数量
    u16_t                   tx_pkts;                     //发送数据包的数量
    struct rte_mbuf        *rx_mbuf[CLIB_DPDK_MBUF_MAX]; //接收数据包的缓冲区
    struct rte_mbuf        *tx_mbuf[CLIB_DPDK_MBUF_MAX]; //发送数据包的缓冲区
} clib_netif_node_t;

typedef struct clib_netif_s 
{
    u08_t   name[64];
    u16_t   queues;
    u08_t   pci[16];
    clib_netif_node_t       node[64];
    u16_t                   queues;                     //网络接口的队列数
    i16_t                   socket_id;                  //绑定网络接口的 CPU 所在的 socket 编号
    u16_t                   port_id;                    //网络接口的端口 ID
    struct rte_mempool     *rx_mbuf_pool[TNET_CPU_MAX]; //接收数据包的内存池数组
    struct rte_mempool     *tx_mbuf_pool[TNET_CPU_MAX]; //发送数据包的内存池数组
    i32_t                   ip_type;                    //网络接口的 IP 模式（IPv4 或 IPv6）
    u32_t                   ipv4;                       //网络接口的 IPv4 地址
    u32_t                   ipv4_mask;                  //网络接口的 IPv4 子网掩码
    u32_t                   ipv6[4];                    //网络接口的 IPv6 地址
    u32_t                   ipv6_mask;                  //网络接口的 IPv6 子网掩码
    struct rte_ether_addr   local_mac;                  //网络接口的 MAC 地址
    struct rte_ether_addr   gate_mac;                   //网络接口的网关 MAC
    i32_t                   rss;                        //是否启用接收端扩展性（RSS）
    i32_t                   promisc;                    //是否启用网卡的混杂模式
    u32_t                   speeds;                     //网卡速度设置
    struct rte_eth_stats    stats;                      //网络接口的统计信息
    struct rte_eth_conf     eth_conf;                   //网络接口的配置信息

} clib_netif_t;

extern u08_t rss_hash_key_be[CLIB_RSS_HASH_KEY_LENGTH];

/**
 * dpdk port相关初始化.
 *
 * @param netif
 *   ports相关结构
 * @param clib_core
 *   配置文件[core]标签
 * @return
 *  0 成功
 * -1 失败
 */
i32_t clib_dpdk_netif_init(clib_netif_t *netifs,clib_port_conf_t *conf);

/**
 * dpdk ports启动.
 *
 * @param netif
 *   ports相关结构
 * @return
 *  0 成功
 * -1 失败
 */
i32_t clib_netif_start(clib_netif_t *netifs,i32_t nb_ports);

/**
 * @brief: 获取端口状态
 * @param netifs 以太网端口状态结构
 * @param nb_ports 以太网端口数量
 * @return  返回一个整数，表示函数的成功或失败
 */
i32_t clib_netif_get_stats(clib_netif_t *netifs,i32_t nb_ports);


#ifdef __cplusplus
}
#endif

#endif 